package dao;

/**
 * Responsavel por realizar transações com o BD
 *
 */
import classes.Fornecedor;
import conexao.GerenciadorConexao;
import erro.ConexaoException;
import erro.ConsultaException;
import erro.DaoException;
import erro.GeralException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class DaoFornecedor implements IDaoFornecedor {

    private GerenciadorConexao g;

    public DaoFornecedor() {
        g = GerenciadorConexao.getInstancia();
    }

    /**
     * Insere um novo registro no BD
     * @param fornec
     * @throws GeralException
     * @throws ConexaoException
     * @throws ConsultaException
     * @throws  SQLException
     */
    @Override
    public void inserir(Fornecedor fornec) throws ConexaoException, DaoException {
        String sql = "INSERT INTO Fornecedor (nomefornecedor, fonefornecedor, cnpjfornecedor) VALUES (?,?,?)";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, fornec.getNomeFornecedor());
            pstm.setString(2, fornec.getFoneFornecedor());
            pstm.setString(3, fornec.getCnpjFornecedor());
            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }

    /**
     * Altera um registro no BD
     * @param fornec
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
    public void alterar(Fornecedor fornec) throws ConexaoException, DaoException {

        String sql = "UPDATE Fornecedor SET nomefornecedor=?, fonefornecedor=?, cnpjfornecedor=? WHERE codfornecedor=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);

            pstm.setString(1, fornec.getNomeFornecedor());
            pstm.setString(2, fornec.getFoneFornecedor());
            pstm.setString(3, fornec.getCnpjFornecedor());
            pstm.setInt(4, fornec.getCodFornecedor());
            pstm.executeUpdate();
        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }

    /**
     * Exclui um registro no BD
     * @param fornec
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
    public void deletar(Fornecedor fornec) throws ConexaoException, DaoException {

        String sql = "DELETE FROM Fornecedor where codfornecedor=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
            pstm.setInt(1, fornec.getCodFornecedor());
            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }

    /**
     * Faz uma pesquisa no BD
     * @param fornec
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
    public Fornecedor pesquisar(Fornecedor fornec) throws ConexaoException, DaoException {
        String sql = "SELECT * FROM Fornecedor where cnpjfornecedor=?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, fornec.getCnpjFornecedor());
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                fornec.setCodFornecedor(rs.getInt("codfornecedor"));
                fornec.setCnpjFornecedor(rs.getString("cnpjfornecedor"));
                fornec.setNomeFornecedor(rs.getString("nomefornecedor"));
                fornec.setFoneFornecedor(rs.getString("fonefornecedor"));
            }
        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
        return fornec;
    }

    @Override
    public List<Fornecedor> pesquisarFornec(Fornecedor fornec) throws ConexaoException, ConsultaException {
        List<Fornecedor> lista = new ArrayList<Fornecedor>();
        String sql = "SELECT * FROM Fornecedor where cnpjfornecedor like ?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, fornec.getCnpjFornecedor());
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                fornec = new Fornecedor();
                fornec.setCodFornecedor(rs.getInt("codfornecedor"));
                fornec.setCnpjFornecedor(rs.getString("cnpjfornecedor"));
                fornec.setNomeFornecedor(rs.getString("nomefornecedor"));
                fornec.setFoneFornecedor(rs.getString("fonefornecedor"));
                lista.add(fornec);
            }
        } catch (SQLException ex) {
            throw new ConsultaException();
        } finally {
            g.disconnect();
        }
        return lista;
    }

    @Override
    public List<Fornecedor> listar() throws ConexaoException, ConsultaException {
        List<Fornecedor> lista = new ArrayList<Fornecedor>();
        Fornecedor fornec;
        String sql = "SELECT * FROM Fornecedor order by nomefornecedor";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);
            while (rs.next()) {
                fornec = new Fornecedor();
                fornec.setCodFornecedor(rs.getInt("codfornecedor"));
                fornec.setCnpjFornecedor(rs.getString("cnpjfornecedor"));
                fornec.setNomeFornecedor(rs.getString("nomefornecedor"));
                fornec.setFoneFornecedor(rs.getString("fonefornecedor"));
                lista.add(fornec);
            }
        } catch (SQLException ex) {
            throw new ConsultaException();
        } finally {
            g.disconnect();
        }
        return lista;
    }
}
